/*
n天数 n个
    r, m p[i][j](r个) m个
        <d, u, r> 一条数据的日期 用户 地区

info不按顺序，存在重复，也可能在同一天访问两个地方

*/
#include <cstdio>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
#define DEBUG
using ll=long long;
using PII=pair<int, int>;
inline int read()
{
    int c=getchar(), f=1, x=0;
    if(c=='-') f*=-1, c=getchar();
    while(c<'0'&&'9'<c) c=getchar();
    while('0'<=c&&c<='9') 
        x=(x<<3)+(x<<1)+c-'0', c=getchar();
    return f*x;
}

inline void write(int x)
{
    if(x<0) putchar('-'), x*=-1;
    if(x>=10) write(x/10);
    putchar(x%10+'0');
}

const int N=1010, INF=0x3f3f3f3f;
#define st first
#define en second
struct Info {
    int day, user, region;
    bool operator<(const Info &x) const { return day<x.day;}
};

int n;
unordered_map<int, PII> regions; //<地区, <风险开始，风险结束>>
vector<Info> info[N]; //按天数存储有判断价值的漫游消息
vector<int> ans[N]; //按天数存储每日风险用户名单

void solve()
{
    n=read();
    for(int day=0; day<n; day++)
    {
        int r=read(), m=read(); //风险地区信息数量 漫游数据的条数
        while(r--)
        {
            int region=read(); //风险地区
            if(regions.count(region)==0
                || day-regions[region].en>1) //当前不存在或者已经结束
                regions[region].st=day;
            regions[region].en=day+6;
        }
        
        while(m--) //漫游消息
        {
            int dt=read(), ut=read(), rt=read(); //在第day天收到的漫游消息
            //生成风险名单的当日，已经不是风险地区  当前地区不为风险地区     风险已结束
            if(day-dt>6 || regions.count(rt)==0 || day>regions[rt].en) 
                continue;
            info[day].push_back({dt, ut, rt});
        }

        for(int i=max(0, day-6); i<=day; i++) //近七日内的漫游数据
        {
            for(int j=0; j<info[i].size(); j++) //第i天到访的用户信息列表
            {
                int dt=info[i][j].day;
                int ut=info[i][j].user;
                int rt=info[i][j].region;
                //近七日到访的地区在到访的那一日仍为风险，并且从到访到名单生成持续处于风险
                //地区存在                         用户到达时为风险地区                  持续风险至审查
                if(regions.count(rt) && regions[rt].st<=dt && day<=regions[rt].en && day-dt<=6)
                    ans[day].push_back(ut);
            }
        }
    }

    for(int day=0; day<n; day++)
    {
        sort(ans[day].begin(), ans[day].end());
        ans[day].erase(unique(ans[day].begin(), ans[day].end()), ans[day].end()); //删除一个用户因不同地区在当天变为风险
        write(day); putchar(' ');
        for(int j=0; j<ans[day].size(); j++)
            write(ans[day][j]), putchar(' ');
        puts("");      
    }
} 

signed main()
{
    #ifdef DEBUG
        freopen("../in.txt", "r", stdin);
        freopen("../out.txt", "w", stdout);
    #endif

    int T=1; //cin >> T; 
    while(T--) 
    {
        solve();
    }
    return 0;
}